home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -seriously_amiga- / shareware / programming / other / apic / examples / 84emu.asm next >
Assembly Source File  |  1998-01-05  |  6KB  |  355 lines

  1.  
  2.  
  3. ;
  4. ; This 16c57 prog can emulate an 16c84 using PICSim. PICEmu
  5. ; is connected direct with the RS232 port. (using 10K for
  6. ; the AMIGA TXD line). PortA and PortB are used for emulating
  7. ; the 16c84. portC is used for the serial connection. The
  8. ; communication speed is 38400 Baud @ 11.0592 Mhz clock.
  9. ;
  10. ;
  11. ; © Dirk Duesterberg, 14.12.1997
  12. ;
  13. ; duesterb@unixserv.rz.fh-hannover.de
  14. ; http://linux.rz.fh-hannover.de/~duesterb
  15. ;
  16.  
  17.  
  18.  
  19.  
  20. ;commands = 0x5x
  21. ;
  22. ;18 pin PIC Emulator soft for 16c57
  23. ;
  24. ;command0 = set tris RA, 1->, 1->
  25. ;command1 = set tris RB, 1->, 1->
  26. ;
  27. ;command4 = write RA,    1->, 1<-, 1->
  28. ;command5 = write RB,    1->, 1<-, 1->
  29. ;
  30. ;command8 = read RA,     1->, 1<-
  31. ;command9 = read RB,     1->, 1<-
  32. ;
  33. ;
  34.  
  35.  
  36.  
  37.         list    p=16c57
  38.  
  39.  
  40.  
  41.  
  42.  
  43. #define    c    03h,0            ;carry bit
  44. #define    dc    03h,1            ;digit carry bit
  45. #define    z    03h,2            ;zero bit
  46. #define    pd    03h,3            ;power down bit
  47. #define    to    03h,4            ;time out bit
  48. #define    pa0    03h,5            ;page select bit (for '56 and '57 only)
  49. #define    pa1    03h,6            ;page select bit (for '57 only)
  50.  
  51.  
  52. pc    =    02h            ;program counter
  53.  
  54. RA    =    05h            ;port a
  55. RB    =    06h            ;port b
  56. RC    =    07h
  57.  
  58.  
  59.  
  60. #define    RXD    RC,1
  61. #define    TXD    RC,2
  62.  
  63. #define beta
  64.  
  65. ram    =    08h            ;begin of ram adress
  66.  
  67.     CBLOCK    ram            ;constant block beginning
  68.  
  69.       count0
  70.       count1
  71.  
  72.       delaycntr
  73.       bitcntr
  74.       serdata
  75.       serbuf
  76.       charcounter
  77.     ENDC                ;end of block
  78.  
  79.  
  80.  
  81.  
  82. clockspeed    =    .11059200            ;clockspeed is 11.0592 Mhz
  83. baudrate    =    .38400                ;19200        ;enter baudrate here
  84.  
  85.  
  86. delay        =    (clockspeed/.4/baudrate-.12)/.4    ;value for baudrate, 12 cycles fixed, 4 cycles delay
  87.  
  88.  
  89. start        movlw    02h
  90.         tris    RC
  91.         movlw    0
  92.         movwf    RC
  93.  
  94.  
  95. :loop        decfsz    count0        ;power up timer
  96.         goto    :loop
  97.         decfsz    count1
  98.         goto    :loop
  99.  
  100.  
  101.  
  102.         movlw    'R'
  103.         movwf    serdata
  104.         call    send_byte
  105.  
  106.  
  107.  
  108.         movlw    'S'
  109.         movwf    serdata
  110.         call    send_byte
  111.  
  112.  
  113.  
  114.  
  115.         movlw    'T'
  116.         movwf    serdata
  117.         call    send_byte
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124. loop        movlw    0f0h
  125.         andwf    serdata,w
  126.         xorlw    050h        ;data = 50h ?
  127.         btfss    z
  128.         goto    loop        ;no match
  129.         
  130.  
  131.         movf    serdata,w
  132.         andlw    0fh        ;clear upper nibble
  133.         addwf    pc        ;jumptable
  134.  
  135.         goto    command0    ;write RA tristate register
  136.         goto    command1    ;write RB tristate register
  137.         goto    command2    ;write RC tristate register (not used)
  138.         goto    command3
  139.         goto    command4    ;write RA latch
  140.         goto    command5    ;write RB latch
  141.         goto    command6    ;write RC latch  (not used)
  142.         goto    command7
  143.         goto    command8    ;read RA pins
  144.         goto    command9    ;read RB pins
  145.         goto    commandA    ;read RC pins
  146.         goto    commandB
  147.         goto    commandC
  148.         goto    commandD
  149.         goto    commandE    
  150.         goto    commandF    ;version info
  151.  
  152.  
  153.  
  154.  
  155.  
  156. command0    call    receive_byte
  157.         movf    serdata,w
  158.         tris    RA
  159.         goto    loop
  160.  
  161.  
  162. command1    call    receive_byte
  163.         movf    serdata,w
  164.         tris    RB
  165.         goto    loop
  166.  
  167.  
  168.  
  169. command2    goto    start
  170. command3    goto    start
  171.  
  172.  
  173. command4    movf    RA,w
  174.         movwf    serdata
  175.         call    send_byte    ;send read data back (ACKnowledge)
  176.  
  177.         call    receive_byte
  178.         movf    serdata,w
  179.         movwf    RA
  180.  
  181.         goto    loop
  182.  
  183.  
  184.  
  185.  
  186. command5    movf    RB,w
  187.         movwf    serdata,w
  188.         call    send_byte    ;send read data back (ACKnowledge)
  189.  
  190.         call    receive_byte
  191.         movf    serdata,w
  192.         movwf    RB
  193.     
  194.         goto    loop
  195.  
  196.  
  197.  
  198. command6
  199.  
  200. command7    goto    start
  201.  
  202. command8    movf    RA,w        ;read port
  203.         movwf    serdata
  204.         call    send_byte    ;send read data back (ACKnowledge)
  205.         goto    start
  206.  
  207. command9    movf    RB,w        ;read port
  208.         movwf    serdata
  209.         call    send_byte    ;send read data back (ACKnowledge)
  210.         goto    loop
  211.  
  212. commandA    movlw    0aah
  213.         movwf    serdata
  214.         call    send_byte
  215.         goto    loop
  216.  
  217.  
  218.  
  219.  
  220. commandB
  221. commandC
  222. commandD
  223. commandE    goto    start
  224.  
  225. commandF    clrf    charcounter
  226. :loop        call    string
  227.         andlw    0ffh
  228.         btfsc    z
  229.         goto    loop        ;return to start if zero byte
  230.  
  231.         movwf    serdata        ;move character to serial buffer
  232.         call    send_byte
  233.         incf    charcounter    ;next character
  234.         goto    :loop
  235.  
  236.  
  237.  
  238.  
  239.  
  240. string        movf    charcounter,w
  241.         addwf    pc,f        ;jump table with string followed by a zero byte. 
  242.  
  243.  
  244.         ifdef    beta
  245.  
  246.           space    2        ;2 blank lines to listfile
  247.           messg "beta Version"    ;message to listfile
  248.           space    2
  249.  
  250.           retlw    "PIC 16c84 EMU beta version, bla, bla, bla",0ah,0ah    ;string, two linefeeds
  251.  
  252.         else
  253.  
  254.           space    2        ;2 blank lines to listfile
  255.           messg "test Version"    ;message to listfile
  256.           space    2
  257.  
  258.           retlw    "PIC 16c84 EMU version 0.9",0ah,0ah    ;string, two linefeeds
  259.  
  260.         endif
  261.  
  262.  
  263.         retlw    0dh,0        ;one cr, Zerobyte => stop sending
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272. send_byte    bsf    TXD        ;set TXD line, dirct connection
  273.         movlw    8h        ;Eight bits in a byte. 
  274.         movwf    bitcntr
  275.  
  276.         call    bitdelay    ;Start bit. ((delay * 4) + 4) cycles
  277.  
  278. xmit        rrf    serdata,f    ;Rotate right moves data bits into
  279.                     ;carry, starting with bit 0. 
  280.  
  281.         btfsc    c        ;clear TXD if carry bit is set
  282.         bcf    TXD        
  283.         btfss    c        ;set TXD if carry bit is clear
  284.         bsf    TXD
  285.  
  286.  
  287.  
  288.         call    bitdelay    ;Data bit.
  289.  
  290.         decfsz    bitcntr,f    ;Not eight bits yet? Send next data bit
  291.         goto    xmit
  292.  
  293.         bcf    TXD        ;clear TXD
  294.         rrf    serdata,f    ;last rotation
  295.  
  296.  
  297.         call    bitdelay    ;Stop bit. ((delay * 4) + 4) cycles
  298.  
  299.         retlw    0
  300.  
  301.  
  302.  
  303. receive_byte    btfss    RXD
  304.         goto    receive_byte    ;wait until startbit
  305.  
  306.         movlw    8h        ;Eight bits in a byte. 
  307.         movwf    bitcntr
  308.  
  309.         call    halfbitdelay    ;wait half bit
  310.  
  311.  
  312. rcb        call    bitdelay    ;wait one bit
  313.  
  314.         btfsc    RXD        ;clear c if RXD is set
  315.         bcf    c        
  316.         btfss    RXD        ;set c if RXD is clear
  317.         bsf    c
  318.  
  319.         rrf    serdata,f
  320.  
  321.         decfsz    bitcntr,f    ;Not eight bits yet? Receive next data bit
  322.         goto    rcb
  323.  
  324.         call    halfbitdelay    ;wait one half bit to get out of data area
  325.  
  326.         retlw    0
  327.  
  328.  
  329. ; To change the baud rate, substitute a new value for bitdelay at the beginning of
  330. ; this program. 
  331.  
  332.  
  333.  
  334. bitdelay    movlw    delay        ;this bitdelay delays ((delay * 4) + 4) cycles
  335.         movwf    delaycntr
  336. :loop        nop
  337.         decfsz    delaycntr,f
  338.         goto    :loop        ;this is an local loop
  339.         retlw    0
  340.  
  341.  
  342.  
  343. halfbitdelay    movlw    delay/2 +1        ;this bitdelay delays ((delay * 4) + 4)/2 cycles
  344.         movwf    delaycntr
  345. :loop        nop
  346.         decfsz    delaycntr,f
  347.         goto    :loop        ;this is an local loop
  348.         retlw    0
  349.  
  350.  
  351.  
  352.  
  353.         org    7ff
  354.         goto    start
  355.